package factorymethod

// Product 工厂方法所创建的对象的接口
type Product interface {
	// 可以定义Product的方法

	// TestFactoryMethod 测试方法
	TestFactoryMethod() string
}

// ConcreteProductA 具体的Product对象
type ConcreteProductA struct {
}

// TestFactoryMethod 实现Product要求的方法
func (c *ConcreteProductA) TestFactoryMethod() string {
	return "ConcreteProductAAA"
}

// ConcreteProductB 具体的Product对象
type ConcreteProductB struct {
}

// TestFactoryMethod 实现Product要求的方法
func (c *ConcreteProductB) TestFactoryMethod() string {
	return "ConcreteProductBBB"
}

// Creator 创建器，声明工厂方法
type Creator interface {
	// 创建Product的工厂方法，返回Product对象
	factoryMethod() Product
}

// 示意方法，实现某些功能的方法
// 通常这些方法实现中需要调用工厂方法来获取Product对象
// 但是golang不支持抽象类，所以不能使用成员方法直接调用factoryMethod获取对象，所以使用参数的方法直接传进去调用
func someOperation(p Product) string {
	//product := factoryMethod()
	return p.TestFactoryMethod() + " common operation"
}

// ConcreteCreatorA 具体的创建器实现对象
type ConcreteCreatorA struct {
}

func (c *ConcreteCreatorA) factoryMethod() Product {
	return &ConcreteProductA{}
}

// ConcreteCreatorB 具体的创建器实现对象
type ConcreteCreatorB struct {
}

func (c *ConcreteCreatorB) factoryMethod() Product {
	return &ConcreteProductB{}
}
